const { Role, Menu, Permission } = require('../models/Middle')
const { Op } = require('sequelize')
const moment = require('moment')
const seq = require('../utils/seq')

// 新增
async function add (role) {
  role.ctime = moment().format('YYYY-MM-DD HH:mm:ss')
  role.mtime = moment().format('YYYY-MM-DD HH:mm:ss')
  try {
    return await Role.create(role)
  } catch (error) {
    throw error
  }
}

// 查询（分页、排序、模糊查询搜索、查询状态）
/**
 * limit 提取多少行，offset 跳过多少行
 * @param {*} page 当前页码
 * @param {*} size 每页条数
 */
async function findAll (query) {
  try {
    const size = query.size ? parseInt(query.size) : 10 // 如果没传参数设置一个默认值
    const page = query.page ? parseInt(query.page) : 1
    const { count, rows } = await Role.findAndCountAll({
      // include: {
      //   model: Menu,
      //   as: 'menus',
      //   attributes: ['id', 'name'],
      //   through: { attributes: [] }, // 隐藏中间表字段
      //   required: true,
      //   include: {
      //     model: Menu,
      //     as: 'children',
      //     attributes: ['id', 'name'],
      //     where: {
      //       pid: {
      //         [Op.not]: null
      //       }
      //     },
      //     nested: true,
      //     include: {
      //       model: Menu,
      //       as: 'children',
      //       attributes: ['id', 'name'], // 测试一下两级和一级菜单是否正确
      //       where: {
      //         pid: {
      //           [Op.not]: null
      //         }
      //       },
      //       nested: true
      //     },
      //   },
      // },
      where: {
        status: {
          [Op.like]: query.status ? `%${JSON.parse(query.status) ? 1 : 0}%` : '%%' // 查询状态
        },
        [Op.or]: [ // 模糊查询
          { name: { [Op.like]: query.search ? `%${query.search}%` : '%%' } },
          { remark: { [Op.like]: query.search ? `%${query.search}%` : '%%' } },
          { ctime: { [Op.like]: query.search ? `%${query.search}%` : '%%' } },
          { mtime: { [Op.like]: query.search ? `%${query.search}%` : '%%' } }
        ],
      },
      offset: (page - 1) * size,
      limit: size,
      distinct: true, // 避免分页出的总数和实际数不匹配
      order: [
        [query.order ? query.order : 'sort', query.sort ? query.sort : 'asc']
      ]
    })
    return {
      count,
      data: rows
    }
  } catch (error) {
    throw error
  }
}

// 修改
async function update (role) {
  role.mtime = moment().format('YYYY-MM-DD HH:mm:ss')
  try {
    return await Role.update(role, {
      where: {
        id: role.id
      }
    })
  } catch (error) {
    throw error
  }
}

// 删除
// 删除角色，先删除角色相关联的表 role_menu、role_perm、user_role
async function deleteById (id) {
  try {
    // 删除角色关联的表
    await seq.query(`delete from user_role where roleId='${id}'`)
    await seq.query(`delete from role_menu where roleId='${id}'`)
    await seq.query(`delete from role_perm where roleId='${id}'`)
    return await Role.destroy({
      where: {
        id
      }
    })
  } catch (error) {
    throw error
  }
}

// 根据id查询（包括菜单权限列表和接口权限列表）
async function findOneById (id) {
  try {
    return await Role.findOne({
      where: {
        id
      },
      include: [
        {
          model: Menu,
          as: 'menus',
          attributes: ['id'],
          required: false,
          through: { attributes: [] },
        },
        {
          model: Permission,
          as: 'rp',
          attributes: ['id', 'perms'],
          required: false,
          through: { attributes: [] }
        }
      ],
    })
  } catch (error) {
    throw error
  }
}

// 根据角色id为该角色菜单授权
async function setRoleMenu (data) {
  try {
    const role = await Role.findOne({ // 找到对应的 role 对象
      where: { id: data['roleId'] }
    })
    const menus = await Menu.findAll({ // 找到对应的 menuIds的对象
      where: { id: data['menuIds'] }
    })
    return await role.setMenus(menus) // 通过 setMenus 方法在 role_menu 表中添加/修改记录
  } catch (error) {
    throw error
  }
}

/** 根据角色id为该角色接口授权
 * 先清空role_perm里面与 roleId  相关的数据
 * 再批量新增数据到 role_perm 中
 */
async function setRolePerm (data) {
  // data: {
  //   roleId: '1'
  //   permIds: ['11', '22',  '33']
  // }
  // -> ('1', '11'), ('1', '22'), ('1', '33'), 
  try {
    if (data['permIds'].length > 0) {
      let vals = []
      await seq.query(`delete from role_perm where roleId='${data['roleId'] }'`)
      data['permIds'].forEach(item => {
        vals.push(`('${data['roleId']}', '${item}')`)
      })
      return await seq.query(`insert into role_perm (roleId, permissionId) values ${vals.join(',')}`)
    } else {
      return await seq.query(`delete from role_perm where roleId='${data['roleId'] }'`)
    }
  } catch (error) {
    throw error
  }
}


// 根据id查询路由菜单列表
// async function findRoleMenu (id) {
//   try {
//     return await Role.findOne({
//       include: [
//         {
//           required: false,
//           model: Menu,
//           as: 'menus',
//           where: {
//             pid: null
//           },
//           include: [
//             {
//               required: false,
//               model: Menu,
//               as: 'children',
//               include: [
//                 {
//                   required: false,
//                   model: Menu,
//                   as: 'children'
//                 }
//               ]
//             }
//           ]
//         }
//       ],
//       where: {
//         id
//       }
//     })
//   } catch (error) {
//     throw error
//   }
// }


module.exports = {
  add,
  findAll,
  update,
  deleteById,
  findOneById,
  setRoleMenu,
  setRolePerm
}